package com.zjitc.p2.obj;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Create by IntelliJ IDEA
 *
 * @author: jsonor
 * @date-Time: 2018/3/13 14:43
 * @description:
 */
public class AProxy implements InvocationHandler{

  /** 被代理对象 -- A */
  private M target;

  public AProxy(M target) {
    this.target = target;
  }

  // Proxy.newProxyInstance() 返回一个代理对象
  // every time 这个代理对象待用这个接口的任意方法时，都会调用invoke方法
  public Object getProxy() {
    Class clazz = this.target.getClass();
    return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
  }

  // method: 被调用方法的信息
  // args: 参数
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    if (method.getName() == "a") {
      System.out.println("init");
      method.invoke(target, args);
      System.out.println("destroy");
    } else {
      method.invoke(target, args);
    }

    return null;
  }
}
